package framework.elements;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.testng.AssertJUnit;

/**
 * Класс, описывающий поле ввода
 */

public class TextBox extends BaseElement {

	public TextBox(final By locator, final String name) {
		super(locator, name);
	}

	public TextBox(String string, String name) {
		super(string, name);
	}

	protected String getElementType() {
		return "Текстбокс";
	}

	/**
	 * Ввести текст в поле ввода
	 * 
	 * @param value
	 */

	public void type(String value) {
		waitAndAssertIsPresent();
		info(String.format("Ввод" + " '%1$s'", value));
		element.sendKeys(value);
	}

	/**
	 * Медленный набор
	 * 
	 * @param text
	 *            text
	 */
	public final void typeSlowly(String text) {
		type("");
		for (char c : text.toCharArray()) {
			info("Ввод '" + c + "'");
			getElement().sendKeys(String.valueOf(c));
			browser.sleep(300);
		}
	}

	/**
	 * Присваивает тегу некоторое значение(innerHTML) с помощью JS
	 * 
	 * @param value
	 *            значение
	 */
	public void setInnerHtml(String value) {
		waitAndAssertIsPresent();
		element.click();
		info("Ввод текста '" + value + "'");
		// Очищаем содержимое поля
		((JavascriptExecutor) browser.getDriver()).executeScript(
				"arguments[0].innerHTML=\"\";", element);
		// element.sendKeys(value);
		((JavascriptExecutor) browser.getDriver()).executeScript(
				"arguments[0].innerHTML=\"" + value + "\";", element);
	}

	public void typeFile(String value) {
		waitNotVisible();
		info(String.format("Ввод" + " '%1$s'", value));
		element.sendKeys(value);
	}

	public void setText(final String value) {
		waitAndAssertIsPresent();
		element.clear();
		type(value);
	}

	public void submit() {
		element.submit();
	}

	/**
	 */
	public void mouseUp() {
		browser.getDriver().getMouse().mouseUp(element.getCoordinates());
	}

	public String getValue() {
		waitAndAssertIsPresent();
		return element.getAttribute("value");
	}

	public void assertIsTextPresent(String product) {
		String text = getValue();
		AssertJUnit.assertTrue(product + " " + " не существует",
				text.contains(product));
	}

	public void assertMaxLenght(int max) {
		String attribute = getAttribute("maxlength");
		if (attribute.isEmpty() || attribute.equals(null)) {
			AssertJUnit
					.fail("Текстовое поле не содержит ограничения на количество символов");
		}
		int current = Integer.parseInt(attribute);
		AssertJUnit.assertTrue(
				String.format("Ожидаемое количество", max, current),
				current == max);
		info("Максимальная длина корректна");
	}

	public void focus() {
		browser.getDriver().findElement(locator).sendKeys("");
	}

	/**
	 * Проверяет значение аттрибута "value"
	 * 
	 * @param text
	 *            ожидаемое значение
	 */
	public void assertValue(String text) {
		waitAndAssertIsPresent();
		String actual = element.getAttribute("value");
		jassert.assertText(name, text, actual, true);
	}

	/**
	 * Проверяет значение аттрибута "value" а также что поле disabled
	 * 
	 * @param value
	 *            ожидаемое значение
	 */
	public void assertDisabledValue(String value) {
		waitAndAssertIsPresent();
		String actual = element.getAttribute("value");
		jassert.assertText(name, value, actual, true);
		assertDisabled();
	}

	/**
	 * Проверяет что аттрибут "value" содержит нужное значение а также что поле
	 * disabled
	 * 
	 * @param value
	 *            ожидаемое значение
	 */
	public void assertDisabledValueContains(String value) {
		waitAndAssertIsPresent();
		String actual = element.getAttribute("value");
		jassert.assertTrue("Аттрибут value не содержит текст: " + value,
				"Аттрибут value содержит текст: " + value,
				actual.contains(value), true);
		assertDisabled();
	}

	/**
	 * Ввод текста при помощи JS
	 * 
	 * @param text
	 *            текст
	 */
	public final void jsType(String text) {
		assertIsPresent();
		info("Ввод текста '" + text + "'");
		((JavascriptExecutor) browser.getDriver()).executeScript(
				"arguments[0].value=\"" + text + "\";", element);
	}

}
